# linux 操作

# 查看错误日志
tail -100 /var/log/mysql/error.log

# 切换 mysql 目录
cd /var/lib/mysql

# 打开 mysql binlog 配置文件
sudo vim /etc/mysql/my.cnf

# 重启 mysql 服务器
systemctl restart mysql

# mysqlbinlog 操作
# 查看日志
mysqlbinlog --no-defaults --database=testdb --base64-output=decode-rows -v binlog.000001 | less
mysqlbinlog --no-defaults --database=testdb --base64-output=decode-rows --start-position=1234 --stop-position=5678 -v binlog.000001 | less

# 数据库恢复
# 找到恢复的起始位置，直接通过二进制日志进行恢复
mysqlbinlog --no-defaults --skip-gtids=true --start-position=721 --stop-position=5426 binlog.000001 | mysql -uroot -pYzg@931112 -h127.0.0.1 -P3306

# 导出二进制日志到 sql 文件
mysqlbinlog --no-defaults --skip-gtids=true --start-position=721 --stop-position=5426 binlog.000001 > testdb.sql

# 从服务器运行备份
mysqlbinlog --read-from-remote-server --raw --host=49.233.162.74 --port=3306 --user=binloggrep --password=123456@Bit --stop-never binlog.000001 --result-file=D:/BitCourse/code/mysql/logs/bak-

# 导出本地数据库中所有数据到磁盘
mysqldump -uroot -p -h127.0.0.1 -P3306 -B testdb > /backup/mysql/dump.sql

# 在命令行通过 mysql 客户工具直接恢复
mysql -uroot -p < /backup/mysql/dump.sql

# 生产环境单库备份
mysqldump -ubackup_user -p -h127.0.0.1 -P3306 \
-B testdb --default-character-set=utf8mb4 \
--single-transaction --source-data=2 \
--triggers --events --routines \
--set-gtid-purged=off > /backup/mysql/`date +%Y%m%d`_0.sql

# 单表多表备份
mysqldump -ubackup_user -p -h127.0.0.1 -P3306 \
-B testdb --tables class student \
--default-character-set=utf8mb4 \
--single-transaction --source-data=2 \
--triggers --events --routines \
--set-gtid-purged=off > /backup/mysql/dump2.sql

# 按条件备份
mysqldump -ubackup_user -p -h127.0.0.1 -P3306 \
-B testdb --tables class student --default-character-set=utf8mb4 \
--single-transaction --source-data=2 \
--triggers --events --routines --set-gtid-purged=off \
--where='id<3' > /backup/mysql/dump3.sql

# 导出表结构
mysqldump -ubackup_user -p -h127.0.0.1 -P3306 \
-B testdb -d --default-character-set=utf8mb4 \
--single-transaction --source-data=2 \
--triggers --events --routines \
--set-gtid-purged=off > /backup/mysql/dump4.sql

# 导出数据
mysqldump -ubackup_user -p -h127.0.0.1 -P3306 \
--databases testdb --hex-blob --no-create-db --no-create-info \
--default-character-set=utf8mb4 \
--single-transaction --source-data=2 \
--triggers --events --routines \
--set-gtid-purged=off --flush-logs > /backup/mysql/dump5.sql

# 数据导入
# 命令行导入
mysql -uroot -p < /backup/mysql/dump6.sql

# 流式导入
mysqldump -ubackup_user -p123456@BitBit -h127.0.0.1 -P3306 \
-B testdb --default-character-set=utf8mb4 \
--single-transaction --source-data=2 \
--triggers --events --routines \
--set-gtid-purged=off | mysql -uroot -p123456 -h192.168.100.237 -P3306

# 监控恢复进度
# Debian/Ubuntu 系统
sudo apt-get install pv

# Red Hat/CentOS 系统 
sudo yum install pv

# 导⼊并查看进度
pv -L1000 /backup/mysql/dump6.sql | mysql -uroot -pYzg@931112 -h127.0.0.1 -P3306
pv -L1000 /backup/mysql/dump6.sql | mysql -uroot -p123456 -h127.0.0.1 -P3306
 
# mysqllimport 导入数据
mysqlimport -uroot -pPassword [--local] dbname filename.txt [OPTION]
mysqlimport -uroot -pYzg@931112 testdb /var/lib/mysql-files/student1.txt

# 数据库物理备份工具
# 安装软件源
dpkg -i percona-xtrabackup-80_8.0.35-31-1.jammy_amd64.deb

# 更新源
apt update

# 如果提⽰缺少依赖运⾏以下命令安装
apt-get install -f

# 安装 xtrabackup 
apt install percona-xtrabackup-80

# 更新源
apt update

# 安装 xtrabackup 
apt install percona-xtrabackup-80

# 验证是否成功
xtrabackup --version

# 备份

# 全量备份
xtrabackup --defaults-file=/etc/mysql/my.cnf \
--host=localhost --port=3306 --user=backup_user --password=123456@BitBit \
--use-memory=1G --parallel=2 \
--backup --target-dir=/backup/mysql/full

# 恢复

# 停止 mysql 服务
systemctl stop mysql
# 查看 mysql 服务是否停止
systemctl status mysql

# 数据目录改名
mv /var/lib/mysql /var/lib/mysql-old
# 创建空目录
mkdir -p /var/lib/mysql

# 准备
xtrabackup --prepare --target-dir=/backup/mysql/full
# 恢复数据
xtrabackup --defaults-file=/etc/mysql/my.cnf --copy-back --parallel=2 --target-dir=/backup/mysql/full

# 为恢复⽬录授权 
chown -R mysql:mysql /var/lib/mysql

# 启动 MySQL 服务
systemctl start mysql

# 查看 MySQL 服务
systemctl status mysql

# 增量备份
# 为当前增量备份指定保存备份的⽬录，以及全量备份的⽬录
xtrabackup --host=localhost --port=3306 --user=backup_user --password=123456@BitBit --backup --target-dir=/backup/mysql/inc1 --incremental-basedir=/backup/mysql/full

# 为当前增量备份指定保存备份的⽬录，以及上⼀次增备的⽬录
xtrabackup --host=localhost --port=3306 --user=backup_user --password=123456@BitBit --backup --target-dir=/backup/mysql/inc2 --incremental-basedir=/backup/mysql/inc1

# 增量恢复
# 准备全量恢复
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full

# 准备第一次增量恢复
xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full --incremental-dir=/backup/mysql/inc1

# 准备第二次增量恢复
xtrabackup --prepare --target-dir=/backup/mysql/full --incremental-dir=/backup/mysql/inc2

# 恢复数据
xtrabackup --copy-back --parallel=2 --target-dir=/backup/mysql/full

# 为恢复⽬录授权
chown -R mysql:mysql /var/lib/mysql
# 启动 MySQL 服务
systemctl start mysql
# 查看 MySQL 服务
systemctl status mysql


